perm filename CHK[AP,SYS]1 blob
sn#000467 filedate 1972-10-26 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00010 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00002 00002 Definitions.
00003 00003 Storage allocations.
00004 00004 Beginning of main program.
00005 00005 Read in data files.
00007 00006 Continue reading in the data files.
00009 00007 Main loop.
00011 00008 Final checks.
00013 00009 Subroutines: MARK,PRINT.
00014 00010 Subroutines: CKMLT,CKMLT2,CKLNKS.
00016 ENDMK
⊗;
;Definitions.
TITLE CHK
EXTERN DDT,$I,JOBREL,JOBFF,JOBSA
AC1←1
AC2←2
AC3←3
AC4←4
DICTWD←5
LAST←6
NEXT←7
CNT←10
ADR←11
QUO←12
REM←13
BPTR←14
MULT←15
MULT1←16
P←17
DEFINE ERRMSG(MSG)
{PUSHJ P, [ OUTSTR [ASCIZ\
MSG
\]
JSR $I
POPJ P,]}
;Storage allocations.
PDLEN←←40
PDLIST: BLOCK PDLEN
DICT: XWD DICTWD,0
XWD DICTWD,0
XWD DICTWD,0
BACK: XWD MULT,0
LINKS: XWD NEXT,0
WORDS: XWD AC1,0
USETBL: XWD AC1,0
DSK17: 17
SIXBIT /DSK/
0
CMD: BLOCK 2
DICTF: SIXBIT /DICT/
BLOCK 3
LINKSF: SIXBIT /LINKS/
BLOCK 3
WORDSF: SIXBIT /WORDS/
BLOCK 3
DIGITS: BLOCK 5
SLINKS: 0 ;SIZE OF THE LINKS FILE
TBLSIZ: 0 ;SIZE OF USETBL
USEEND: 0
SAVEAC: 0
SDICT: 0 ;SIZE OF THE DICT FILE
MINMLT: 0 ;SMALLEST MULT PTR FOUND
MLTSTT: 0 ;RELATIVE LOCATION OF START OF MULT PART OF DICT
LOCMIN: 0 ;DICT ENTRY CORRESPONDING TO MINMLT
;Beginning of main program.
CHK: MOVE P,[IOWD PDLEN,PDLIST]
CALLI ;RESET
HRRZ AC2,JOBFF
CALLI AC2,11 ;CORE
ERRMSG {CORE UUO FAILED: RESET}
;Read in data files.
AGAIN1: OPEN 1,DSK17
ERRMSG {CANT OPEN THE DSK: DICT}
SETZM DICTF+3
LOOKUP 1,DICTF
JRST [RELEAS 1,
MOVEI AC1,1
CALLI AC1,31 ;SLEEP
JRST AGAIN1]
HLRE AC1,DICTF+3
TRNE AC1,177
ERRMSG {DICT DOES NOT END ON RECORD BOUNDARY}
MOVNM AC1,SDICT ;save size of DICT file
MOVE AC2,JOBREL
HRRZM AC2,CMD
HRLM AC1,CMD
ADDI AC2,1
HRRM AC2,DICT ;set up DICT indirect pointers
ADDI AC2,1
HRRM AC2,DICT+1
ADDI AC2,1
HRRM AC2,DICT+2
HRRM AC2,BACK
SUBI AC2,2 ;readjust AC2 to pt to first wd of DICT
SUB AC2,AC1
HRRM AC2,LINKS ;set up LINKS indirect ptr
CALLI AC2,11 ;CORE
ERRMSG {CORE UUO FAILED: DICT}
IN 1,CMD
JRST .+2
ERRMSG {IN UUO FAILED: DICT}
RELEAS 1,
OPEN 1,DSK17
ERRMSG {CANT OPEN THE DSK: LINKS}
SETZM LINKSF+3
LOOKUP 1,LINKSF
ERRMSG {LOOKUP FAILED: LINKS}
HLRE AC1,LINKSF+3
MOVNM AC1,SLINKS ;save size of LINKS file
HRRZ AC2,LINKS
AOS LINKS ;correct LINKS indirect ptr
HRRZM AC2,CMD
HRLM AC1,CMD
SUB AC2,AC1
HRRM AC2,WORDS ;set up WORDS indirect ptr
CALLI AC2,11 ;CORE
ERRMSG {CORE UUO FAILED: LINKS}
IN 1,CMD
JRST .+2
ERRMSG {IN UUO FAILED: LINKS}
RELEAS 1,
;Continue reading in the data files.
OPEN 1,DSK17
ERRMSG {CANT OPEN THE DSK: WORDS}
SETZM WORDSF+3
LOOKUP 1,WORDSF
ERRMSG {LOOKUP FAILED: WORDS}
HLRE AC1,WORDSF+3
HRRZ AC2,WORDS
AOS WORDS ;correct WORDS indirect ptr
HRRZM AC2,CMD
HRLM AC1,CMD
SUB AC2,AC1
HRRM AC2,USETBL ;set up USETBL indirect ptr
CALLI AC2,11 ;CORE
ERRMSG {CORE UUO FAILED: WORDS}
IN 1,CMD
JRST .+2
ERRMSG {IN UUO FAILED: WORDS}
RELEAS 1,
HRRZ AC2,USETBL
AOS USETBL ;correct USETBL indirect ptr
MOVE AC1,SLINKS
TRNE AC1,77
ADDI AC2,100
ASH AC1,-6
MOVEM AC1,TBLSIZ
SOS TBLSIZ
ADD AC2,AC1
HRRZM AC2,USEEND
CALLI AC2,11 ;CORE
ERRMSG {CORE UUO FAILED: USETBL}
HRRZ AC1,USETBL
HRLZI AC2,740000
MOVEM AC2,(AC1)
HRL AC1,AC1
ADDI AC1,1
BLT AC1,@USEEND
HRRZ AC2,USEEND
HRRM AC2,JOBFF
;Main loop.
SETZM MLTSTT
MOVEI MULT,-1
MOVEM MULT,MINMLT
SETZM USED#
SETZ DICTWD,
NXTDWD: ADDI DICTWD,2
HLRZ AC1,@DICT
MOVE AC4,@WORDS
CAMN AC4,[77B6]
JRST MULTS
PUSHJ P,CKMLT
PUSHJ P,CKLNKS
JRST NXTDWD
MULTS: ADDI DICTWD,2
TRZE DICTWD,177
ADDI DICTWD,200
MOVEM DICTWD,MLTSTT
NXTMLT: PUSHJ P,CKMLT
HRRE MULT,@DICT+2
PUSHJ P,CKMLT2
PUSHJ P,CKLNKS
ADDI DICTWD,3
CHKREC: SKIPE @DICT
JRST NXTMLT
ADDI DICTWD,2
TRNN DICTWD,177
JRST CHKREC
;Final checks.
MOVE AC1,MINMLT
MOVE ADR,LOCMIN
CAMGE AC1,MLTSTT
ERRMSG {MULT PTR POINTS TO MAIN PART OF DICT, NOT MULT PART}
SETO CNT,
SETZ NEXT,
NXTFRE: ADDI CNT,1
CAML NEXT,SLINKS
ERRMSG {PTR TO NEXT AVAIL SLOT IS OUT OF RANGE}
PUSHJ P,MARK
MOVE NEXT,@LINKS
TLZE NEXT,-1
ERRMSG {NON-ZERO LEFT HALF OF AVAIL SLOT}
JUMPN NEXT,NXTFRE
MOVEM CNT,FREE#
;Calculate locations of unreachable slots.
SETZ AC1,
NXTWD: AOSN AC2,@USETBL
JRST GETWD
SUBI AC2,1
SETCA AC2,
SETZ CNT,
JRST BOT
TOP: ADDI CNT,1(AC3)
LSH AC2,1(AC3)
MOVE ADR,AC1
ASH ADR,6
ADDI ADR,=72
SUB ADR,CNT
SUB ADR,CNT
CAMGE ADR,SLINKS
ERRMSG {LOST SLOT (ADR)}
BOT: JFFO AC2,TOP
GETWD: CAMGE AC1,TBLSIZ
AOJA AC1,NXTWD
OUTSTR [ASCIZ /
/]
MOVE QUO,FREE
PUSHJ P,PRINT
OUTSTR [ASCIZ / SLOTS LEFT IN AVAIL LIST
/]
MOVE QUO,USED
PUSHJ P,PRINT
OUTSTR [ASCIZ / SLOTS TOTAL
/]
CALLI 1,12 ;EXIT
JRST CHK
;Subroutines: MARK,PRINT.
MARK: LDB AC1,[POINT 12,NEXT,29] ;get adr of marking word
LDB AC2,[POINT 5,NEXT,34] ;get shift amount
MOVEI AC3,1
LSH AC3,(AC2)
MOVE AC4,AC3
AND AC4,@USETBL
JUMPE AC4,MOK ;was this link already marked used
ERRMSG {SLOT IN TWO LISTS}
SETZ AC3,
MOK: ORM AC3,@USETBL ;no. marOk it now
AOS USED
POPJ P,
PRINT: MOVE BPTR,[POINT 7,DIGITS]
PUSHJ P,NXTDG
SETZ AC1,
IDPB AC1,BPTR
OUTSTR DIGITS
POPJ P,
NXTDG: IDIVI QUO,=10
PUSH P,REM
SKIPE QUO
PUSHJ P,NXTDG
COLLEC: POP P,AC1
ADDI AC1,60
IDPB AC1,BPTR
POPJ P,
;Subroutines: CKMLT,CKMLT2,CKLNKS.
CKMLT: HLRE MULT,@DICT+1 ;check MULT ptr for consistency
CKMLT2: JUMPE MULT,CPOPJ
JUMPG MULT,.+3
ERRMSG {NEGATIVE MULT PTR}
POPJ P,
CAML MULT,SDICT
ERRMSG {MULT PTR OUT OF RANGE}
CAMLE MULT,MINMLT
JRST CKMLT1
CAML MULT,MINMLT
ERRMSG {TWO MULT PTRS POINT TO SAME MULT ENTRY}
MOVEM MULT,MINMLT
MOVEM DICTWD,LOCMIN
CKMLT1:
HLRE MULT1,@BACK
CAME MULT1,DICTWD
ERRMSG {INCORRECT BACK MULT PTR}
TRZ MULT,-200
IDIVI MULT,3
JUMPE MULT+1,CPOPJ
ERRMSG {MULT PTR NOT MULTIPLE OF 3}
CPOPJ: POPJ P,
CKLNKS: HRRZ NEXT,@DICT+1 ;check story list in LINKS for this keyword
JUMPE NEXT,CPOPJ ;zero means no stories contain this keyword
CAIN NEXT,-1 ;-1 means this is not a legal keyword
POPJ P,
CAML NEXT,SLINKS
ERRMSG {PTR FROM DICT TO LINKS IS OUT OF RANGE}
MOVNM DICTWD,LAST
NXTLNK: HRRE AC2,@LINKS
CAME AC2,LAST
ERRMSG {INCORRECT BACK PTR FOR DOUBLY LINKED LIST IN LINKS}
PUSHJ P,MARK
MOVE LAST,NEXT
HLRZ NEXT,@LINKS
CAML NEXT,SLINKS
ERRMSG {PTR TO NEXT SLOT IS OUT OF RANGE (SINGLE)}
JUMPN NEXT,NXTLNK
POPJ P,
END CHK